 ;-----------------------------\
 ;escape 4k demo                 \
 ;made for code craft contest      \
 ;code - tom/kulture 1999            \
 ;------------------------------------ \

 ;Tunnel part---------------------------------------------------------------|

 ;Wait incase showing this one..
 ldr r5,work
.t_waitv
 ldr r6,show
 cmp r6,r5
 ;if the shown bank is the one we are about to write on we must wait..
 beq t_waitv

 ;sort out radius morphing bizness
 ldr r14,counter
 cmp r14,#1024
 blt no_morph
 ldr r14,radius
 ldr r13,radius_circle
 mov r12,#256/4
.morph
 ldmia r13,{r3-r6}
 ldmia r14!,{r7-r10}

 sub r7,r7,r3
 add r3,r3,r7,asr #2
 sub r8,r8,r4
 add r4,r4,r8,asr #2
 sub r9,r9,r5
 add r5,r5,r9,asr #2
 sub r10,r10,r6
 add r6,r6,r10,asr #2

 stmia r13!,{r3-r6}
 subs r12,r12,#1
 bne morph

.no_morph

 ;setup addresses
 ldr r12,video
 ldr r5,work
 sub r5,r5,#1
 mov r6,r5,lsl #7
 add r6,r6,r5,lsl #5
 add r12,r12,r6,lsl #8

 adr r11,bss
 add r11,r11,#(64*128+64)*4
 ldr r10,tex

 ldr r9,z
 mov r9,r9,asr #1

 ldr r8,radius_circle

 mov r14,#yres
.yloop
 adr r3,oc
 stmia r3,{r0-r2}
 mov r13,#xres
.xloop

 ;r14=yp
 ;r13=xp
 ;r12=screen
 ;r11=mega lookup
 ;r10=texture
 ;r9=texture addon
 ;r8=radius table
 ;---------------------
 ;r0-x r1-y (eg 160,128) r2-z (256 length)
 ;---------------------------------------
 mov r3,r0,asr #16
 mov r4,r1,asr #16
 add r3,r3,r4,lsl #7 ;lookup address
 ;load radius/SQR(x^2+y^2) and ATN(y/x)
 ldr r3,[r11,r3,lsl #2]
 and r4,r3,#&ff ;r4=v
 mov r3,r3,asr #8
 ;r3=t<<14
 ;--------
 ;calculate nice shape bizness
 ldr r5,[r8,r4,lsl #2]
 mul r3,r5,r3
 mov r5,r2,asr #14
 mul r3,r5,r3
 add r5,r9,r3,asr #14
 and r5,r5,#63
 ;r5=u
 ;----
 and r4,r4,#63
 add r5,r5,r4,lsl #6
 ldrb r4,[r10,r5]

 eor r3,r3,r3,asr #31
 subs r4,r4,r3,asr #16
 movlt r4,#0
 mov r4,r4,asr #4
 orr r4,r4,r4,lsl #4
 strb r4,[r12],#1
 strb r4,[r12],#1
 ;move pixel on virtual screen +loop
 adr r3,vx
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 subs r13,r13,#1
 bne xloop
 ;copy line
 mov r13,#(xscreen/(4*8))
 sub r4,r12,#xscreen/2
 mov r5,r12
 add r6,r12,#xscreen/2
 add r12,r12,#xscreen
.t_cloop
 ldmia r4!,{r0-r3}
 stmia r5!,{r0-r3}
 stmia r6!,{r0-r3}
 stmia r12!,{r0-r3}
 subs r13,r13,#1
 bne t_cloop

 ;reload old x coordinate
 adr r0,oc
 ldmia r0,{r0-r2}
 ;move pixel on v screen down
 adr r3,vy
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 subs r14,r14,#1
 bne yloop

 ldr r1,work
 subs r1,r1,#1
 moveq r1,#3
 str r1,work

 b loop
